// 模块来控制应用程序的生命周期和创建本地浏览器窗口
// "start": "electron ."
// 打包 更换 package.json scripts属性
// "start": "electron-forge start",
// "package": "electron-forge package",
// "make": "electron-forge make"
const { app, BrowserWindow, ipcMain, Menu, dialog, globalShortcut, nativeTheme, nativeImage, Tray } = require('electron')
const path = require('node:path')
const Store = require('electron-store')

const store = new Store({
  // 定义默认设置
  defaults: {
    bounds: { // 窗口位置及大小
      width: 1200,
      height: 900,
      x: 0,
      y: 0
    },
    theme: 'system', // 主题 默认跟随系统
    fontSize: 26, // 编辑区文字大小
    color: null, // 编辑区文字颜色
    backgroundColor: null, // 背景颜色
    filePath: null, // 当前编辑文件路径
    autoSave: false, // 自动保存状态 默认关闭
    centerLastRow: false, // 末行居中 默认关闭
    intervalTime: 1, // 自动保存间隔 默认1分钟
    winOpen: true, // 窗口打开默认最大化
    enableTray: false // 关闭窗口不退出 最小化托盘 默认关闭
  }
})

// 主窗口
var mainWindow
// 关闭窗口通行标识
var closeTok = true
// 菜单是否展示标识
var menuTok = true
// 托盘
var tray
// 是否最小化
let minimize = false

function createWindow () {
  // 创建浏览器窗口。
  mainWindow = new BrowserWindow({
    width: store.get('bounds').width,
    height: store.get('bounds').height,
    x: store.get('bounds').x,
    y: store.get('bounds').y,
    minWidth: 400, // 最小宽度
    minHeight: 300, // 最小高度
    icon: 'ww.ico',
    webPreferences: {
      nodeIntegration: true,
      preload: path.join(__dirname, 'preload.js')
    }
  })

  // 然后加载应用的index.html。
  mainWindow.loadFile('index.html')

  // 读取用户设置的主题
  nativeTheme.themeSource = store.get('theme') // nativeTheme.shouldUseDarkColors true 深色主题 false 浅色主题

  // 打开窗口默认是否最大化
  if (store.get('winOpen')) {
    mainWindow.maximize()
  }

  // 打开DevTools。
  // mainWindow.webContents.openDevTools()

  // 窗口关闭事件
  mainWindow.on('close', (e) => {
    if (store.get('enableTray')) {
      if (closeTok) {
        e.preventDefault()
        mainWindow.hide()
        minimize = true
      }
    } else {
      store.set('bounds', mainWindow.getBounds());
      if (closeTok) {
        e.preventDefault() // 停止关闭窗口
        mainWindow.webContents.send('checkSave')
      }
    }
  });

  // 创建自定义菜单
  const template = [
    {
      label: '文件',
      submenu: [
        {
          label: '新建',
          accelerator: 'Ctrl+N',
          click: () => {
            newAdd()
          }
        },
        {
          label: '打开',
          accelerator: 'Ctrl+O',
          click: () => {
            open()
          }
        },
        {
          label: '保存',
          accelerator: 'Ctrl+S',
          click: () => {
            save()
          }
        },
        {
          label: '另存为',
          accelerator: 'Alt+S',
          click: () => {
            saveAs()
          }
        }
      ]
    },
    {
      label: '设置',
      submenu: [
        {
          label: '自动保存',
          submenu: [
            {
              label: '开启',
              accelerator: 'Alt+Q',
              click: () => {
                if (!store.get('autoSave')) {
                  mainWindow.webContents.send('openAutoSave')
                }
              }
            },
            {
              label: '关闭',
              accelerator: 'Alt+W',
              click: () => {
                if (store.get('autoSave')) {
                  mainWindow.webContents.send('closeAutoSave')
                }
              }
            },
            {
              label: '自定义',
              click: () => {
                mainWindow.webContents.send('updateAutoSaveIntervalTime')
              }
            }
          ]
        },
        {
          label: '末行居中',
          submenu: [
            {
              label: '开启',
              accelerator: 'Alt+E',
              click: () => {
                if (!store.get('centerLastRow')) {
                  mainWindow.webContents.send('openCenterLastRow')
                }
              }
            },
            {
              label: '关闭',
              accelerator: 'Alt+R',
              click: () => {
                if (store.get('centerLastRow')) {
                  mainWindow.webContents.send('closeCenterLastRow')
                }
              }
            }
          ]
        },
        {
          label: '打开窗口',
          submenu: [
            {
              label: '窗口最大化',
              click: () => {
                store.set('winOpen',true)
              }
            },
            {
              label: '上次关闭时样式',
              click: () => {
                store.set('winOpen',false)
              }
            },
          ]
        },
        {
          label: '窗口关闭',
          submenu: [
            {
              label: '最小化托盘',
              click: () => {
                store.set('enableTray',true)
              }
            },
            {
              label: '退出',
              click: () => {
                store.set('enableTray',false)
              }
            },
          ]
        },
        {
          label: '主题',
          submenu: [
            {
              label: '浅色',
              click: () => {
                nativeTheme.themeSource = 'light'
                store.set('theme', 'light')
              }
            },
            {
              label: '深色',
              click: () => {
                nativeTheme.themeSource = 'dark'
                store.set('theme', 'dark')
              }
            },
            {
              label: '跟随系统',
              click: () => {
                nativeTheme.themeSource = 'system'
                store.set('theme', 'system')
              }
            },
            {
              label: '自定义',
              click: () => {
                mainWindow.webContents.send('customThemeDialog')
              }
            }
          ]
        },
        {
          label: '菜单',
          submenu: [
            {
              label: '隐藏',
              accelerator: 'Ctrl+Tab',
              click: () => {
                mainWindow.setMenuBarVisibility(false)
              }
            }
          ]
        }
      ]
    },
    {
      label: '十',
      accelerator: 'Alt+Up',
      click: () => {
        mainWindow.webContents.send('enlarge')
      }
    },
    {
      label: '一',
      accelerator: 'Alt+Down',
      click: () => {
        mainWindow.webContents.send('narrow')
      }
    },
    {
      label: '帮助',
      submenu: [
        {
          label: '重置设置',
          click: () => {
            nativeTheme.themeSource = 'system' // 重置主题
            mainWindow.webContents.send('reset')
            store.clear(); // 重置数据库，恢复默认值
          }
        },
        {
          label: '文本找回',
          click: () => {
            mainWindow.webContents.send('restoreText')
          }
        },
        {
          label: '快捷键',
          click: () => {
            mainWindow.webContents.send('shortcutKeys')
          }
        },
        {
          label: '关于',
          click: () => {
            mainWindow.webContents.send('about')
          }
        }
      ]
    }
  ]
  const menu = Menu.buildFromTemplate(template)
  Menu.setApplicationMenu(menu)
}

// 当Electron完成初始化并准备创建浏览器窗口时，将调用此方法。
// 有些api只能在此事件发生后使用。
app.whenReady().then(() => {
  createWindow()
  createTray()
  // 注册 Ctrl+Tab 快捷键，隐藏/展示菜单
  globalShortcut.register('Ctrl+Tab', () => {
    if (menuTok){
      mainWindow.setMenuBarVisibility(false)
      menuTok = false
    } else {
      mainWindow.setMenuBarVisibility(true)
      menuTok = true
    }
  });

  // 注册 Ctrl+W 快捷键，实现快速关闭窗口功能
  globalShortcut.register('Ctrl+W', () => {
    mainWindow.webContents.send('checkSave', minimize)
  });

  // 注册 Ctrl+F 快捷键，实现全局搜索功能
  globalShortcut.register('Ctrl+F', () => {
    mainWindow.webContents.send('find')
  });

  // 注册 Ctrl+R 快捷键，实现全局替换功能
  globalShortcut.register('Ctrl+R', () => {
    mainWindow.webContents.send('replace')
  });

  // 监听托盘图标的点击事件，鼠标左键点击直接显示窗口
  tray.on('click', (event, bounds, trayPosition) => {
    mainWindow.show()
    minimize = false
  });

  app.on('activate', function () {
    // 在macOS上，当点击dock图标而没有打开其他窗口时，
    // 在应用程序中重新创建一个窗口是很常见的。
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

// 当所有窗口都关闭时退出，除了macOS。在那里，
// 应用程序和它们的菜单栏通常保持活动状态，直到用户使用Cmd + Q显式退出。
app.on('window-all-closed', function () {
  // tray.destroy(); // 清除托盘图标
  if (process.platform !== 'darwin') app.quit()
})

// 在这个文件中，你可以包括你的应用程序的特定主进程代码的其余部分。
// 您也可以将它们放在单独的文件中，并在这里要求它们。
// 通过 Electron 的 IPC 主进程和渲染进程通信

// 关闭窗口时，main.js调用prdload.js中异步方法，执行完毕后调用此方法来关闭窗口
ipcMain.on('mainWindow-close', (event) => {
  closeTok = false
  mainWindow.close();
})

// 关闭窗口时文件另存为
ipcMain.on('mainWindow-openFileWin', (event) => {
  dialog.showOpenDialog({ properties: ['openFile'], filters: [{ name: 'Text Files', extensions: ['txt'] }] }).then((result) => {
    if (!result.canceled) {
      store.set('filePath', result.filePaths[0]) // 更新当前编辑的文件路径
      mainWindow.webContents.send('save', result.filePaths[0], true)
    }
  }).catch(err => {
    openDialog('选择文件失败!', err)
  })
})

// 显示窗口
ipcMain.on('mainWindow-show', (event) => {
  mainWindow.show()
  minimize = false
})

// 弹出错误提示框
function openDialog(message, detail){
  dialog.showMessageBox({
    type: 'error',
    message: message,
    detail: detail,
    buttons: ['确定'],
  });
}

// 新建
function newAdd(){
  mainWindow.webContents.send('clean')
}

// 打开
function open(){
  dialog.showOpenDialog({ properties: ['openFile'],filters: [{ name: 'Text Files', extensions: ['txt'] }] }).then((result) => {
    if (!result.canceled) {
      let filePath = result.filePaths[0]
      store.set('filePath', filePath) // 更新当前编辑的文件路径
      mainWindow.webContents.send('open', filePath, path.basename(filePath).replace('.txt', ''))
    }
  }).catch(err => {
    openDialog('打开文件失败!', err)
  })
}

// 保存
function save(){
  let filePath = store.get('filePath')
  if (filePath) {
    mainWindow.webContents.send('save', filePath, false)
  } else {
    dialog.showOpenDialog({ properties: ['openFile'], filters: [{ name: 'Text Files', extensions: ['txt'] }] }).then((result) => {
      if (!result.canceled) {
        store.set('filePath', result.filePaths[0]) // 更新当前编辑的文件路径
        mainWindow.webContents.send('saveToFile', result.filePaths[0])
      }
    }).catch(err => {
      openDialog('选择文件失败!', err)
    })
  }
}

// 另存为
function saveAs(){
  dialog.showOpenDialog({ properties: ['openFile'], filters: [{ name: 'Text Files', extensions: ['txt'] }] }).then((result) => {
    if (!result.canceled) {
      mainWindow.webContents.send('save', result.filePaths[0], false)
    }
  }).catch(err => {
    openDialog('选择文件失败!', err)
  })
}

// 创建托盘
function createTray(){
  // 打包需要使用下方路径，放在项目根目录下的图片默认不会打包
  // const icon = nativeImage.createFromPath('ww.png')
  const icon = nativeImage.createFromPath('resources/images/ww.png')
  tray = new Tray(icon) // 指定托盘图标
  tray.setToolTip('white-write')
  let contextMenu = Menu.buildFromTemplate([
    {
      label: '打开',
      click: () => {
        mainWindow.show()
        minimize = false
      }
    },
    {
      label: '退出',
      click: () => {
        mainWindow.webContents.send('checkSave', minimize)
      }
    }
  ])
  tray.setContextMenu(contextMenu)
}

// 右键点击菜单
ipcMain.on('show-context-menu', (event) => {
  const template = [
    {
      label: '隐藏菜单',
      click: () => {
        mainWindow.setMenuBarVisibility(false)
      }
    },
    {
      label: '展示菜单',
      click: () => {
        mainWindow.setMenuBarVisibility(true)
      }
    }
  ]
  const menu = Menu.buildFromTemplate(template)
  menu.popup({ window: BrowserWindow.fromWebContents(event.sender) })
})